package is.ru.honn.rupin.data;

import is.ru.honn.rupin.domain.Board;
import is.ruframework.data.RuData;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Sigrún Inga Kristinsdóttir.
 * Date: 18.10.2012
 * Time: 15:20
 * copyright (c) sigruninga&susanne
 *
 * @author Sigrún Inga kristindóttir og Susanne Götz
 * @version 1.1
 */

/**
 * Gagnagrunnstenging fyrir borð.
 */
public class BoardData extends RuData implements BoardDataGateway
{

    /**
     * Fall sem skráir upplýsingar um boarð í gagnagrunn.
     * @param board
     */
    public void add(Board board) {

        SimpleJdbcInsert insertBoard = new SimpleJdbcInsert(getDataSource())
                .withTableName("ru_boards");

        Map<String, Object> parameters = new HashMap<String, Object>(3);
        parameters.put("boardname", board.getName());
        parameters.put("category", board.getCategory());
        parameters.put("username", board.getCreator().getUsername());
        try
        {
            insertBoard.execute(parameters);
        }
        catch (DataIntegrityViolationException divex)
        {
            log.warning("Duplicate entry");
        }

    }

    /**
     *  Fall sem nær í borð með nafni borðs og notendanafni úr gagnagrunni.
      * @param boardname
     * @param username
     * @return borði sem er náð í úr töflunni eða null ef enginn borð er til sem uppfyllir skilyrði.
     */
    public Board getBoardByKey(String boardname, String username) {
        JdbcTemplate queryContent = new JdbcTemplate(getDataSource());
        String sql = "select * from ru_boards where boardname = ? and username = ?";
        Board board;
        // til að hafa möguleika að skila null ef engin board tengd þessu boardname og username finnst
        // því queryForObject þarf að skila eintaki af board, annars hættir keyrslan
        try
        {

            board = queryContent.queryForObject(sql, new BoardRowMapper()
                , new Object[]{boardname, username});
        }
        catch(EmptyResultDataAccessException e)
        {
            //System.out.println("No board with this name and username");
            return null;
        }
        return board;
    }

    /**
     * Fall sem nær í öll borð tengd þessu usernafni úr gagnagrunni
     * @param username
     * @return Lista af borðum
     */
    public List<Board> getBoardsByUser(String username)
    {
        JdbcTemplate queryContent = new JdbcTemplate(getDataSource());
        String sql = "select * from ru_boards where username = ?";
        List<Board> boards = queryContent.query(sql, new Object[]{username}, new BoardRowMapper());
        /*for (Board b : boards)
        {
            System.out.println(b.getName());
        }*/
        return boards;
    }
}
